package com.ywk.springCore.lifeCycle.applicationListener;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;

/**
 *
 * ApplicationListener：事件监听器（容器加载完之后运行，即所有bean都生成后执行）
 * 注：系统会存在两个容器，一个是root application context，另一个就是我们自己的projectName-servlet context，此时会
 * 造成onApplicationEvent方法被执行两次
 * @Author zbh
 * @Date 2023/5/8
 */

@Component
@Slf4j
public class MyApplicationListener implements ApplicationListener<ContextRefreshedEvent> {

    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        /**
         * 为了避免上面提到的问题，我们可以只在root application context初始化完成后调用逻辑代码，其他的容器的初始化完成，则不做任务处理。
         */
        if (event.getApplicationContext().getParent() == null) {
            //逻辑代码
            log.info("所有bean都生成后执行ApplicationListener.onApplicationEvent事件监听");
            ApplicationContext applicationContext = event.getApplicationContext();
            MyApplicationListener myApplicationListener = applicationContext.getBean("myApplicationListener", MyApplicationListener.class);
            log.info("获取MyApplicationListener实例bean：{}",myApplicationListener);
            //获取注解属性值
            /*String[] beanNamesForAnnotation = applicationContext.getBeanNamesForAnnotation(MyAnn.class);
            Arrays.stream(beanNamesForAnnotation).forEach(s -> {
                log.info("{}",s);
            });*/
        }

    }
}
